package com.kayang.common;

import com.kayang.common.core.UserContext;
import com.kayang.nadapt.util.JsonConvert;
import com.kayang.nadapt.util.LogHelper;
import com.kayang.nadapt.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Autowired
    RestTemplate restTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");

        String jwsTokenSrcName= "JwsToken";
        String url = StringUtil.format("http://{0}/checkToken", jwsTokenSrcName);

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("token", token);

        HttpEntity httpEntity = new HttpEntity(httpHeaders);

//        HttpResilience4jCommand tokenHystrixCommand = new HttpResilience4jCommand(url, "GET", null, null);
//        Map map = tokenHystrixCommand.execute();

        ResponseEntity<Map> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, Map.class);
        if (responseEntity.getStatusCodeValue() != 200) {
            throw new CommonException(JsonConvert.serializeObject(responseEntity.getBody()));
        }
        Map map = responseEntity.getBody();
        if(map.get("Result") == null){
            LogHelper.login("token:" + token);
            throw new CommonException("token校验失败");
        }
        UserContext uc = JsonConvert.deserializeObject(map.get("Result").toString(), UserContext.class);
        LogHelper.login("获取用户上下文OK：account ：" + uc.getUserAccount());
        request.setAttribute("UserContext", uc);
        return true;
    }

    private  void userLoadProperties(UserContext uc) {
//        Database db = DatabaseFactory.getMainDB();
//        String sql = "SELECT * FROM skySecUserProperties where disabled = 0 ";
//        DataView dv = db.query(sql);
//        for (int i = 0; i < dv.size(); i++) {
//            String xDataSql = dv.get(i).getString("datasql").toString().toUpperCase(); // .replace("{U_URID}",
//            int pos = xDataSql.indexOf("{U_URID}");
//            while (pos > 0) {
//                xDataSql = StringUtil.format("{0}{1}{2}", xDataSql.substring(0, pos), uc.U_URID, xDataSql.substring(pos + 8));
//                pos = xDataSql.indexOf("{U_URID}");
//            }
//            DataView xPKeysDV = db.query(xDataSql);
//            if (xPKeysDV.size() > 0) {
//                for (int j = 0; j < xPKeysDV.getTable().getColumns().size(); j++) {
//                    String xPKey = xPKeysDV.getTable().getColumns().get(j).getColumnName(); // xPKeys[j];
//                    if (!StringUtil.isNullOrEmpty(xPKey)) {
//                        switch (xPKey) {
//                            case "U_EID":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_EID"))) {
//                                    uc.setEmpID(Convert.toInt32(xPKeysDV.get(0).getString("U_EID")));
//                                    uc.getUserProperties().put("U_EID", xPKeysDV.get(0).getString("U_EID").toString());
//                                }
//                                break;
//                            case "U_CPID":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_CPID"))) {
//                                    uc.setU_CPID(xPKeysDV.get(0).get("U_CPID").toString());
//                                    uc.getUserProperties().put("U_CPID", xPKeysDV.get(0).get("U_CPID").toString());
//                                }
//                                break;
//                            case "U_DPID":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_DPID"))) {
//                                    uc.setU_DPID(xPKeysDV.get(0).get("U_DPID").toString());
//                                    uc.getUserProperties().put("U_DPID", xPKeysDV.get(0).get("U_DPID").toString());
//                                }
//                                break;
//                            case "U_JBID":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_JBID"))) {
//                                    uc.setU_JBID(xPKeysDV.get(0).get("U_JBID").toString());
//                                    uc.getUserProperties().put("U_JBID", xPKeysDV.get(0).get("U_JBID").toString());
//                                }
//                                break;
//                            case "U_BADGE":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_BADGE"))) {
//                                    uc.setU_BADGE(xPKeysDV.get(0).get("U_BADGE").toString());
//                                    uc.getUserProperties().put("U_BADGE", xPKeysDV.get(0).get("U_BADGE").toString());
//                                }
//                                break;
//                            case "U_NAME":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_NAME"))) {
//                                    uc.setU_NAME(xPKeysDV.get(0).get("U_NAME").toString());
//                                    uc.getUserProperties().put("U_NAME", xPKeysDV.get(0).get("U_NAME").toString());
//                                }
//                                break;
//                            case "U_ENAME":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_ENAME"))) {
//                                    uc.setU_ENAME(xPKeysDV.get(0).get("U_ENAME").toString());
//                                    uc.getUserProperties().put("U_ENAME", xPKeysDV.get(0).get("U_ENAME").toString());
//                                }
//                                break;
//                            case "U_EZID":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_EZID"))) {
//                                    uc.setU_ENAME(xPKeysDV.get(0).get("U_EZID").toString());
//                                    uc.getUserProperties().put("U_EZID", xPKeysDV.get(0).get("U_EZID").toString());
//                                }
//                                break;
//                            case "U_PWD":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("U_PWD"))) {
//                                    uc.setU_ENAME(xPKeysDV.get(0).get("U_PWD").toString());
//                                    uc.getUserProperties().put("U_PWD", xPKeysDV.get(0).get("U_PWD").toString());
//                                }
//                                break;
//                            case "PZID":
//                                if (!StringUtil.isNullOrEmpty(xPKeysDV.get(0).getString("PZID"))) {
//                                    uc.setPZID(xPKeysDV.get(0).get("PZID").toString());
//                                    uc.getUserProperties().put("PZID", xPKeysDV.get(0).get("PZID").toString());
//                                }
//                                break;
//                            default:
//                                break;
//                        }
//                    }
//                }
//                if (StringUtil.isNullOrEmpty(uc.getU_URID())) {
//                    uc.setU_URID(1);
//                }
//            }
        }


}